#include <iostream>
#include <jsoncpp/json/json.h>
#include <unistd.h>
#include <sstream>
#include <string>
#include <memory>

// // 低版本
// int main()
// {
//     // 序列化
//     Json::Value part1;
//     part1["haha"] = "haha";
//     part1["hehe"] = "hehe";

//     Json::Value root;
//     root["x"] = 100;
//     root["y"] = 200;
//     root["op"] = '+';
//     root["desc"] = "this is a + oper";
//     root["test"] = part1;

//     // 单行输出
//     Json::FastWriter w;
//     std::string res = w.write(root);

//     // // 多行输出
//     // // 方法一：
//     // Json::StyledWriter w;
//     // std::string res = w.write(root);
    
//     // // // 方法二：
//     // std::string res = root.toStyledString();

//     std::cout << res << std::endl;

//     sleep(3);

//     // 反序列化
//     Json::Value v;
//     Json::Reader r;
//     r.parse(res,v);

//     int x = v["x"].asInt();
//     int y = v["y"].asInt();
//     char op = v["op"].asInt();
//     std::string desc = v["desc"].asString();
//     Json::Value temp = v["test"];
//     std::cout << x << std::endl;
//     std::cout << y << std::endl;
//     std::cout << op << std::endl;
//     std::cout << desc << std::endl;

//     return 0;
// }

// 高版本
int main()
{
    const char* name = "小明";
    int age = 18;
    float score[] = {77.5,88,93.6};

    Json::Value data;
    data["姓名"] = name;
    data["年龄"] = age;
    data["成绩"].append(score[0]);
    data["成绩"].append(score[1]);
    data["成绩"].append(score[2]);

    Json::StreamWriterBuilder swb;
    swb["emitUTF8"] = true;
    std::unique_ptr<Json::StreamWriter>sw(swb.newStreamWriter());

    std::stringstream ss;
    sw->write(data,&ss);
    std::cout << ss.str() << std::endl;

    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader>cr(crb.newCharReader());
    
    const std::string& str = ss.str();
    const char* start = str.c_str();
    const char* end = start + str.length();

    std::string err;
    cr->parse(start,end,&data,&err);

    std::cout << "姓名：" << data["姓名"].asString() << std::endl;
    std::cout << "年龄：" << data["年龄"].asString() << std::endl;
    int size = data["成绩"].size();
    for(int i = 0;i < size;i++)
    {
        std::cout << data["成绩"][i] << std::endl;
    }

    std::cout << "正常结束" << std::endl;
    return 0;
}
